--- 模块功能：lcddemo
-- @module lcd
-- @author Dozingfiretruck
-- @release 2021.01.25

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "lcddemo"
VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

-- sys库是标配
_G.sys = require("sys")

-- UI带屏的项目一般不需要低功耗了吧, Air101/Air103设置到最高性能
if mcu and (rtos.bsp() == "AIR101" or rtos.bsp() == "AIR103" or rtos.bsp() == "AIR601" ) then
    mcu.setClk(240)
end

--[[
-- LCD接法示例
LCD管脚       Air780E管脚    Air101/Air103管脚   Air105管脚
GND          GND            GND                 GND
VCC          3.3V           3.3V                3.3V
SCL          (GPIO11)       (PB02/SPI0_SCK)     (PC15/HSPI_SCK)
SDA          (GPIO09)       (PB05/SPI0_MOSI)    (PC13/HSPI_MOSI)
RES          (GPIO01)       (PB03/GPIO19)       (PC12/HSPI_MISO)
DC           (GPIO10)       (PB01/GPIO17)       (PE08)
CS           (GPIO08)       (PB04/GPIO20)       (PC14/HSPI_CS)
BL(可以不接)  (GPIO22)       (PB00/GPIO16)       (PE09)


提示:
1. 只使用SPI的时钟线(SCK)和数据输出线(MOSI), 其他均为GPIO脚
2. 数据输入(MISO)和片选(CS), 虽然是SPI, 但已复用为GPIO, 并非固定,是可以自由修改成其他脚
3. 若使用多个SPI设备, 那么RES/CS请选用非SPI功能脚
4. BL可以不接的, 若使用Air10x屏幕扩展板,对准排针插上即可
]]

--添加硬狗防止程序卡死
if wdt then
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end

local rtos_bsp = rtos.bsp()

-- 根据不同的BSP返回不同的值
-- spi_id,pin_reset,pin_dc,pin_cs,bl
function lcd_pin()
    if rtos_bsp == "AIR101" then
        return 0,pin.PB03,pin.PB01,pin.PB04,pin.PB00
    elseif rtos_bsp == "AIR103" then
        return 0,pin.PB03,pin.PB01,pin.PB04,pin.PB00
    elseif rtos_bsp == "AIR105" then
        return 5,pin.PC12,pin.PE08,pin.PC14,pin.PE09
    elseif rtos_bsp == "ESP32C3" then
        return 2,10,6,7,11
    elseif rtos_bsp == "ESP32S3" then
        return 2,16,15,14,13
    elseif rtos_bsp == "EC618" then
        return 0,1,10,8,22
    elseif rtos_bsp == "EC718P" then
        return lcd.HWID_0,36,0xff,0xff,0xff -- 注意:EC718P有硬件lcd驱动接口, 无需使用spi,当然spi驱动也支持
    else
        log.info("main", "bsp not support")
        return
    end
end

local spi_id,pin_reset,pin_dc,pin_cs,bl = lcd_pin()

if spi_id ~= lcd.HWID_0 then
    spi_lcd = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)
    port = "device"
else
    port = spi_id
end

    --[[ 此为合宙售卖的1.8寸TFT LCD LCD 分辨率:128X160 屏幕ic:st7735 购买地址:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-24045920841.19.6c2275a1Pa8F9o&id=560176729178]]
    -- lcd.init("st7735",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 0,w = 128,h = 160,xoffset = 0,yoffset = 0},spi_lcd)

    --[[ 此为合宙售卖的1.54寸TFT LCD LCD 分辨率:240X240 屏幕ic:st7789 购买地址:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-24045920841.20.391445d5Ql4uJl&id=659456700222]]
    --lcd.init("st7789",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 0,w = 240,h = 320,xoffset = 0,yoffset = 0},spi_lcd)

    --[[ 此为合宙售卖的0.96寸TFT LCD LCD 分辨率:160X80 屏幕ic:st7735s 购买地址:https://item.taobao.com/item.htm?id=661054472686]]
    lcd.init("st7735v",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 1,w = 160,h = 80,xoffset = 0,yoffset = 24},spi_lcd)
    --如果显示颜色相反，请解开下面一行的注释，关闭反色
    --lcd.invoff()
    --如果显示依旧不正常，可以尝试老版本的板子的驱动
    -- lcd.init("st7735s",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 2,w = 160,h = 80,xoffset = 0,yoffset = 0},spi_lcd)

-- 不在内置驱动的, 看demo/lcd_custom
--lcd.setColor(0xFFFF,0x0000)
lcd.setColor(0x0000,0xFFFF)
--lcd.drawQrcode(40, 0, '山东邹平台子', 80)
--按键引脚定义
local key1 = pin.PA01 -- 左
local key2 = pin.PA07 -- 上
local key3 = pin.PA04 -- 中
local key4 = pin.PA00 -- 右
local key5 = pin.PB11 -- 下

-- 若固件支持防抖, 启用防抖
if gpio.debounce then
    gpio.debounce(key1, 20,1)
end
-- 若固件支持防抖, 启用防抖
if gpio.debounce then
    gpio.debounce(key2, 20,1)
end
-- 若固件支持防抖, 启用防抖
if gpio.debounce then
    gpio.debounce(key3, 20,1)
end
-- 若固件支持防抖, 启用防抖
if gpio.debounce then
    gpio.debounce(key4, 20,1)
end
-- 若固件支持防抖, 启用防抖
if gpio.debounce then
    gpio.debounce(key5, 20,1)
end

gpio.setup(key1,function ()
	zuo=1
--	print('左')
end,gpio.PULLUP,gpio.FALLING)
gpio.setup(key2,function ()
	shang=1
--	print('上')
end,gpio.PULLUP,gpio.FALLING)
gpio.setup(key3,function ( ... )
	zhong=1
--	print('中')-- body
end,gpio.PULLUP,gpio.FALLING)
gpio.setup(key4,function ()
	you=1
--	print('右')-- body
end,gpio.PULLUP,gpio.FALLING)
gpio.setup(key5,function ()
	xia=1
--	print('下')
end,gpio.PULLUP,gpio.FALLING)

 --lcd.fill(0,20,100,40,0xf00f)
lcd.clear()
sys.taskInit(function()
    -- 开启缓冲区, 刷屏速度回加快, 但也消耗2倍屏幕分辨率的内存
    -- lcd.setupBuff()          -- 使用lua内存
    -- lcd.setupBuff(nil, true) -- 使用sys内存, 只需要选一种
    -- lcd.autoFlush(false)
	lcd.setFont(lcd.font_opposansm12_chinese) -- 具体取值可参考api文档的常量表
lcd.drawStr(40,15,"生命计时器",0xff000)
lcd.drawStr(0,40,'剩余:',0x0f0f0f)
lcd.drawStr(140,40,'秒',0x0f0f0f)
--lcd.drawStr(0,70,"当前:  2024-03-08",0x00ff00)

-- 本库的目标是替代fdb库
-- 1. 兼容fdb的函数
-- 2. 使用fdb的flash空间,启用时也会替代fdb库
-- 3. 功能上与EEPROM是类似的
fskv.init()
--fskv.set("wendal", 1234)
--fskv.set("nian", 2024)
--fskv.set("yue", 10)
--fskv.set("ri", 20)
log.info("fskv", "wendal", fskv.get("wendal"))
local used, total,kv_count = fskv.status()
log.info("fdb", "kv", used,total,kv_count)
nn,yy,rr=fskv.get("nian"),fskv.get("yue"),fskv.get("ri")
aa='当前: '..nn..'-'..yy..'-'..rr
lcd.drawStr(0,70,aa,0x00ff00)

--[[
fskv与fdb的实现机制导致的差异

                    fskv          fdb
1. value长度        4096           255
2. key长度          63             64
3. 空间利用率(对比)  较低           较高
4. 读取速度         恒定           脏数据影响速度,非恒定
5. 写入数据         恒定           脏数据影响速度,非恒定
6. 均衡擦除         自动           自动
]]


 	while 1 do

	for i=529600000,1,-1 do
		ab=tostring(i)
		lcd.drawStr(40,40,ab,0x0f0f0f)
		sys.wait(1000)
		-- lcd颜色填充
		--lcd.clear()
		lcd.fill(40,25,135,45,0x00000)
		--lcd.setFont(lcd.font_opposansm12_chinese)
	end
	--    sys.wait(5000)
	--	lcd.close()
	end
end)

sys.taskInit(function()
	while 1 do

		if shang==1 then
			shang =0;
			lcd.fill(75,55,100,75,0x000ff)
			lcd.drawStr(80,70,"上",0xffffff)
		end
		if xia==1 then
			xia=0
			lcd.fill(75,55,100,75,0xff000)
			lcd.drawStr(80,70,"下",0xffffff)
		end
		if zuo==1 then
			zuo=0
			lcd.fill(75,55,100,75,0xff00)
			lcd.drawStr(80,70,"左",0xffffff)
		end
		if you==1 then
			you=0
			lcd.fill(75,55,100,75,0xf0f0f0)
			lcd.drawStr(80,70,"右",0xffffff)
		end
		if zhong==1 then
			zhong=0
			lcd.fill(75,55,100,75,0x0f0f0f)
			lcd.drawStr(80,70,"中",0xffffff)
		end

		sys.wait(1)
	end
end)


-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
